iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0

環境變數是你應用程序中一個至關重要的部分,你需要在你的 Turborepo 配置中考慮到這一點。

使用 Turborepo 處理環境變數時有三個重要問題:

  1. 我的環境變數是否在任務哈希中被考慮?
  2. Turborepo 將使用哪種環境模式?
  3. 我是否處理了我的 .env 文件?

如果未能在配置中考慮環境變數,可能導致你的應用程序使用錯誤的配置發布。這可能會導致嚴重問題,如將預覽部署發布到生產環境。

值得注意的是:Turborepo 也使用系統環境變數來配置其自身的行為。下面,你將找到關於任務運行時環境變數的信息以及它們如何影響任務哈希。

將環境變數添加到任務哈希

Turborepo 需要知道你的環境變數,以考慮應用行為的變化。為此,使用 turbo.json 文件中的 envglobalEnv 鍵。

{
  "globalEnv": ["IMPORTANT_GLOBAL_VARIABLE"],
  "tasks": {
    "build": {
      "env": ["MY_API_URL", "MY_API_KEY"]
    }
  }
}
  • globalEnv:此列表中任何環境變數的值變更將改變所有任務的哈希。
  • env:包括影響任務的環境變數值的變更,允許更好的細分。例如,一個 lint 任務可能不需要在 API_KEY 的值變更時錯過緩存,但一個構建任務可能應該如此。

值得注意的是:Turborepo 支持環境變數的通配符,因此你可以輕鬆地考慮到具有給定前綴的所有環境變數。有關 env 的更多信息,請訪問 API 參考文檔。

框架推斷

Turborepo 會自動為常見框架的 env 鍵添加前綴通配符。如果你在一個包中使用下列框架之一,你不需要指定這些前綴的環境變數:

  • Astro: PUBLIC_*
  • Blitz: NEXT_PUBLIC_*
  • Create React App: REACT_APP_*
  • Gatsby: GATSBY_*
  • Next.js: NEXT_PUBLIC_*
  • Nitro: NITRO_*
  • Nuxt.js: NUXT_*, NITRO_*
  • RedwoodJS: REDWOOD_ENV_*
  • Sanity Studio: SANITY_STUDIO_*
  • Solid: VITE_*
  • SvelteKit: VITE_*
  • Vite: VITE_*
  • Vue: VUE_APP_*

值得注意的是:框架推斷是每個包獨立的。

如果你想選擇退出框架推斷,你可以通過以下方式進行:

  • 使用 -framework-inference=false 運行任務
  • env 鍵中添加一個負通配符(例如,"env": ["!NEXT_PUBLIC_*"]

環境模式

Turborepo 的環境模式允許你控制任務運行時可用的環境變數:

  • 嚴格模式(默認):僅過濾在 turbo.jsonenvglobalEnv 鍵中指定的環境變數。
  • 寬鬆模式:允許進程的所有環境變數可用。

嚴格模式

嚴格模式將任務運行時可用的環境變數過濾為僅在 turbo.json 中的 globalEnvenv 鍵中指定的那些。

這意味著如果任務沒有考慮到它們需要的所有環境變數,很可能會失敗。這是一件好事,因為你不想緩存一個在不同環境中可能有不同行為的任務。

使用寬鬆模式時,只要在 turbo 運行時環境變數可用,你的腳本就可以使用它。然而,這也讓你更容易忘記在配置中考慮環境變數,允許任務在不應該的情況下命中緩存。

例如,你可能有一些代碼在你的應用程序中從 API 獲取數據,使用環境變數作為基本 URL:

const data = fetch(`${process.env.MY_API_URL}/resource/1`);

當你準備將你的應用程序發布到生產環境時,你使用針對預覽環境的 MY_API_URL 值構建你的應用程序。即使 MY_API_URL 變數的值已更改,你也會看到一個緩存命中!MY_API_URL 更改了 - 但 Turborepo 恢復了一個使用預覽環境的 MY_API_URL 而非生產的 MY_API_URL 的應用程序版本。

當你使用寬鬆模式時,即使沒有在任務哈希中計算 MY_API_URL,它在任務運行時仍然可用。為了讓這個任務更可能失敗並保護你免受此類配置錯誤的影響,我們鼓勵你選擇嚴格模式。


上一篇
Turborepo cache 機制
下一篇
Turborepo 環境變數2
系列文
讓我們一起與turboRepo共舞13
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言